
####################################################################################################################################
############# Détermination des IBDs sur toutes les paires d'un pedigree arbitraire ################################################
############# Il faut d'abord estimer les coefficients  d'apparentement avec idcoeff et ensuite lancer ibdld #######################
############# On pourra également ajouter une population générale (DESIR et ou HapMap) afin d'estimer le LD ########################
############# Le problème principal de cette suite de programmes est que :  - il faut de identifiants numériques ###################
#############################################################  - il faut que les parents viennent avant les enfants dans l'ordre  ##

####################################################################################################################################
# Création des coefficients : il faut d'abord changer les codes individus par des codes de nombre entiers ##########################
# Il s'agit de créer les fichier d'entrée pour le programme idcoeff mais aussi IBDLD ###############################################
####################################################################################################################################

# Récupération des arguments
args <- commandArgs(TRUE)

tped <- read.table(file=args[1],h=F)
# Le pedigree qui va être analysé dans un premier temps ne marchera pas

ped <- tped[,c(2,3,4)]
colnames(ped) <- c("V1","V2","V3")
fam_names <- as.character(tped[,1])
fam_names <- unique(fam_names)


##########################################################################################################
########## Algorithme TAAMEERE, qui permet de mettre dans l'ordre les parents avant les enfants ##########

# Identification des parents :
# Fondateurs purs
nind <- dim(ped)[1]
ntotal <- 0

# Initialisation des vrais fondateurs ...
found <- as.character(ped[ped$V2==0 & ped$V3==0,"V1"]) # found = fondateurs (ceux dont les colonnes père et mère sont à 0)
while(ntotal < nind) {
# Puis ceux qui sont strictement issus de deux fondateurs
tmp_found <- as.character(ped[ped$V2 %in% found & ped$V3 %in% found & !(ped$V1 %in% found),"V1"])
found <- c(found,tmp_found) 
ntotal <- length(found)
rm(tmp_found)
#print(c(ntotal,"LA LA",found))  
}

###################### Fin de l'algorithme TAAMEERE - l'ordre des individus est dans found #################
# Ecriture du pedigree dans le nouvel ordre à partir du vecteur found
nped <- ped # Initialisation du nouveau pedigree ordonné
for (i in 1:dim(nped)[1]) {nped[i,] <- ped[ped$V1==found[i],]}

# Recodage
corr <- matrix(ncol=2,nrow=(dim(ped)[1]))
for (i in 1:dim(nped)[1]) {corr[i,1] <- as.character(nped[i,1]);corr[i,2] <- i
                           }

corr <- as.data.frame(corr)
## nnped est le pedigree qui va être donné à idcoeff
nnped <- matrix(ncol=dim(ped)[2],nrow=(dim(ped)[1]))
for (i in 1:dim(nped)[1]) {for (j in 1:3){nnped[i,j] <- ifelse(nped[i,j]=="0","0",as.character(corr[corr$V1==as.character(nped[i,j]),2]))}}

# Nous allons sortir trois fichier d'intérêt :
# D'abord celui nécéssaire pour calculer le les coefficients d'apparentement avec le recodage (c'est le nnped).
# Puis le fichier de recodage afin de garder les correspondances (corr qui sera sauvegardé en corresp_[nom fam].txt)
# 
# Enfin, le fichier pedigree avec les identifiants originels permettant de séléctionner le marqueurs dans l'ordre avec plink
# il s'agit du nped
# Enfin, on crée à partir du nped un fichier "to_keep_[nom fam].txt" donnant famille et individu des id à garder.
write.table(nnped,file=paste("./forIdcoeff/pedcoef_",fam_names,".p",sep=""),row.names=F,col.names=F,quote=F)
write.table(nnped[,1],file=paste("./forIdcoeff/pedcoef_",fam_names,".s",sep=""),row.names=F,col.names=F,quote=F)
write.table(corr,file=paste("./forIdcoeff/corresp_",fam_names,".txt",sep=""),row.names=F,col.names=F,quote=F)
write.table(nped,file=paste("./forIdcoeff/orderped_",fam_names,".p",sep=""),row.names=F,col.names=F,quote=F)
